module tb_add_vector();


   
   // logic [63:0] sum;
   // logic [7:0] 	carrys;
   // logic [63:0] a, b;
   // logic [3:0] 	mode;
   // // one 64+64, two 32+32, four 16+16, eight 8+8
   // add_vector #(.width(64), .granu(8)) U_add_vector (
   // 													  // Outputs
   // 													  .o_sum				(sum[63:0]),
   // 													  .o_carrys			(carrys[7:0]),
   // 													  // Inputs
   // 													 .i_a				(a[63:0]),
   // 													 .i_b				(b[63:0]),
   // 													 .i_mode			(mode) );
   
   
   
   // initial
   // 	 begin
   // 		logic [31:0] u32a, u32b, u32;
   // 		logic [63:0] u64a, u64b, u64;
   // 		logic 		 carrya, carryb, carryc, carryd, carry;
   // 		logic [7:0]  carrys_test;

		
		
   // 		$display("==================== test 64-bit mode ====================");
   // 		mode = 4'b1000; 		// 64-bit adder
   // 		for(int i=0;i<1000;i++)
   // 		  begin
   // 			 a = {$random, $random};
   // 			 b = {$random, $random};
   // 			 {carry, u64} = a + b;
   // 			 #1;
   // 			 $display("%d + %d = %d (%x), carry is %d  => correct sum:%x, carry:%d => %s", 
   // 					  a, b, sum, sum, carrys[7],
   // 					  u64, carry,
   // 					  {carrys[7], sum} === {carry, u64} ? "equal" : "Not Equal"
   // 					  );
   // 			 if({carrys[7], sum} !== {carry,u64})
   // 			   begin
   // 				  $display("failed");
   // 				  $finish;
   // 			   end
   // 		  end // for (int i=0;i<1000;i++)
   // 		$display("==================== passed ====================");


   // 		$display("==================== test 32-bit mode ====================");
   // 		mode = 4'b0100; 		// 32-bit adder
   // 		for(int i=0;i<1000;i++)
   // 		  begin
   // 			 a = {$random, $random};
   // 			 b = {$random, $random};
   // 			 {carrya, u64[31:0] } = a[31:0] + b[31:0];
   // 			 {carryb, u64[63:32]} = a[63:32] + b[63:32];
   // 			 #1;
   // 			 if(!((sum === u64) && (carrys[3]===carrya) && (carrys[7]===carryb)))
   // 			   begin
   // 				  $display("failed");
   // 				  $finish;
   // 			   end
   // 		  end // for (int i=0;i<1000;i++)
   // 		$display("==================== passed ====================");


   // 		$display("==================== test 16-bit mode ====================");
   // 		mode = 4'b0010; 		// 16-bit adder
   // 		for(int i=0;i<1000;i++)
   // 		  begin
   // 			 a = {$random, $random};
   // 			 b = {$random, $random};
   // 			 {carrya, u64[15:0]} = a[15:0] + b[15:0];
   // 			 {carryb, u64[31:16]} = a[31:16] + b[31:16];
   // 			 {carryc, u64[47:32]} = a[47:32] + b[47:32];
   // 			 {carryd, u64[63:48]} = a[63:48] + b[63:48];
   // 			 #1;
   // 			 if( !((sum === u64) && ({carrys[7], carrys[5], carrys[3], carrys[1]} === {carryd, carryc, carryb, carrya})) )
   // 			   begin
   // 				  $display("failed");
   // 				  $finish;
   // 			   end
   // 		  end
   // 		$display("==================== passed ====================");


   // 		$display("==================== test 8-bit mode ====================");
   // 		mode = 4'b0001; 		// 8-bit adder
   // 		for(int i=0;i<1000;i++)
   // 		  begin
   // 			 a = {$random, $random};
   // 			 b = {$random, $random};
   // 			 {carrys_test[0], u64[7:0]} = a[7:0] + b[7:0];
   // 			 {carrys_test[1], u64[15:8]} = a[15:8] + b[15:8];
   // 			 {carrys_test[2], u64[23:16]} = a[23:16] + b[23:16];
   // 			 {carrys_test[3], u64[31:24]} = a[31:24] + b[31:24];
   // 			 {carrys_test[4], u64[39:32]} = a[39:32] + b[39:32];
   // 			 {carrys_test[5], u64[47:40]} = a[47:40] + b[47:40];
   // 			 {carrys_test[6], u64[55:48]} = a[55:48] + b[55:48];
   // 			 {carrys_test[7], u64[63:56]} = a[63:56] + b[63:56];

   // 			 #1;
   // 			 if(!((sum === u64) && (carrys===carrys_test)))
   // 			   begin
   // 				  $display("failed");
   // 				  $finish;
   // 			   end
   // 		  end // for (int i=0;i<1000;i++)
   // 		$display("==================== passed ====================");
		
   // 	 end
   

   logic [63:0] sum;
   logic [3:0] 	carrys;
   logic [63:0] a, b;
   logic [2:0] 	mode;
   // one 64+64, two 32+32, four 16+16
   add_vector #(.width(64), .granu(16)) U_add_vector (
													  // Outputs
													  .o_sum			(sum),
													  .o_carrys			(carrys),
													  // Inputs
													  .i_a				(a),
													  .i_b				(b),
													  .i_mode			(mode) );


   initial
   	 begin
   		logic [31:0] u32a, u32b, u32;
   		logic [63:0] u64a, u64b, u64;
   		logic 		 carrya, carryb, carryc, carryd, carry;
   		logic [7:0]  carrys_test;

		
		
   		$display("==================== test 64-bit mode ====================");
   		mode = 3'b100; 		// 64-bit adder
   		for(int i=0;i<1000;i++)
   		  begin
   			 a = {$random, $random};
   			 b = {$random, $random};
   			 {carry, u64} = a + b;
   			 #1;
   			 $display("%d + %d = %d (%x), carry is %d  => correct sum:%x, carry:%d => %s", 
   					  a, b, sum, sum, carrys[3],
   					  u64, carry,
   					  {carrys[3], sum} === {carry, u64} ? "equal" : "Not Equal"
   					  );
   			 if({carrys[3], sum} !== {carry,u64})
   			   begin
   				  $display("failed");
   				  $finish;
   			   end
   		  end // for (int i=0;i<1000;i++)
   		$display("==================== passed ====================");


		$display("==================== test 32-bit mode ====================");
   		mode = 3'b010; 		// 32-bit adder
   		for(int i=0;i<1000;i++)
   		  begin
   			 a = {$random, $random};
   			 b = {$random, $random};
   			 {carrya, u64[31:0] } = a[31:0] + b[31:0];
   			 {carryb, u64[63:32]} = a[63:32] + b[63:32];
   			 #1;
   			 if(!((sum === u64) && (carrys[1]===carrya) && (carrys[3]===carryb)))
   			   begin
   				  $display("failed");
   				  $finish;
   			   end
   		  end // for (int i=0;i<1000;i++)
   		$display("==================== passed ====================");


   		$display("==================== test 16-bit mode ====================");
   		mode = 3'b001; 		// 16-bit adder
   		for(int i=0;i<1000;i++)
   		  begin
   			 a = {$random, $random};
   			 b = {$random, $random};
   			 {carrya, u64[15:0]} = a[15:0] + b[15:0];
   			 {carryb, u64[31:16]} = a[31:16] + b[31:16];
   			 {carryc, u64[47:32]} = a[47:32] + b[47:32];
   			 {carryd, u64[63:48]} = a[63:48] + b[63:48];
   			 #1;
   			 if( !((sum === u64) && (carrys === {carryd, carryc, carryb, carrya})) )
   			   begin
   				  $display("failed");
   				  $finish;
   			   end
   		  end
   		$display("==================== passed ====================");


   		// $display("==================== test 8-bit mode ====================");
   		// mode = 4'b0001; 		// 8-bit adder
   		// for(int i=0;i<1000;i++)
   		//   begin
   		// 	 a = {$random, $random};
   		// 	 b = {$random, $random};
   		// 	 {carrys_test[0], u64[7:0]} = a[7:0] + b[7:0];
   		// 	 {carrys_test[1], u64[15:8]} = a[15:8] + b[15:8];
   		// 	 {carrys_test[2], u64[23:16]} = a[23:16] + b[23:16];
   		// 	 {carrys_test[3], u64[31:24]} = a[31:24] + b[31:24];
   		// 	 {carrys_test[4], u64[39:32]} = a[39:32] + b[39:32];
   		// 	 {carrys_test[5], u64[47:40]} = a[47:40] + b[47:40];
   		// 	 {carrys_test[6], u64[55:48]} = a[55:48] + b[55:48];
   		// 	 {carrys_test[7], u64[63:56]} = a[63:56] + b[63:56];

   		// 	 #1;
   		// 	 if(!((sum === u64) && (carrys===carrys_test)))
   		// 	   begin
   		// 		  $display("failed");
   		// 		  $finish;
   		// 	   end
   		//   end // for (int i=0;i<1000;i++)
   		// $display("==================== passed ====================");
		
   	 end

endmodule
		

